home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BOBOLI.ZIP / SRC / MKEY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-04  |  2.8 KB  |  121 lines

  1. /* MKEY
  2.    keyboard interface unit
  3. */
  4.  
  5. #include <dpmi.h>
  6. #include "mkey.h"
  7.  
  8. #define _KB_intr 9
  9.  
  10. keyarray oldkeyb,keyb;
  11. static _go32_dpmi_seginfo old_rm_kb_vector,
  12.                           new_rm_kb_vector,
  13.                           old_pm_kb_vector,
  14.                           new_pm_kb_vector;
  15.  
  16. unsigned char keyspressed[20];
  17. unsigned char numkeyspressed;
  18. unsigned char keyevent;
  19.  
  20. static _go32_dpmi_registers _kb_r;
  21.  
  22. void pm_kb_handler(void);
  23. void rm_kb_handler(void);
  24.  
  25. void kb_clearbuf()
  26. {
  27.   numkeyspressed=0;
  28. }
  29.  
  30. void kb_init()
  31. {
  32.   new_pm_kb_vector.pm_selector=_go32_my_cs();
  33.   new_pm_kb_vector.pm_offset=(int) pm_kb_handler;
  34.   new_rm_kb_vector.pm_selector=_go32_my_cs();
  35.   new_rm_kb_vector.pm_offset=(int) rm_kb_handler;
  36.   keyevent=0;
  37.   memset(keyb,0,128);
  38.   memset(oldkeyb,0,128);
  39.   disable();
  40.   _go32_dpmi_get_protected_mode_interrupt_vector(_KB_intr,
  41.     &old_pm_kb_vector);
  42.   _go32_dpmi_chain_protected_mode_interrupt_vector(_KB_intr,
  43.     &new_pm_kb_vector);
  44.   _go32_dpmi_allocate_real_mode_callback_iret(&new_rm_kb_vector, &_kb_r);
  45.   _go32_dpmi_get_real_mode_interrupt_vector(_KB_intr, 
  46.     &old_rm_kb_vector);
  47.   enable();
  48. }
  49.  
  50. void kb_exit(void)
  51. {
  52.   disable();
  53.   _go32_dpmi_set_real_mode_interrupt_vector(_KB_intr, 
  54.     &old_rm_kb_vector);
  55.   _go32_dpmi_set_protected_mode_interrupt_vector(_KB_intr, 
  56.     &old_pm_kb_vector);
  57.   _go32_dpmi_free_real_mode_callback(&new_rm_kb_vector);
  58.   enable();
  59. }
  60.  
  61. unsigned char keypress()
  62. {
  63.   unsigned char k;
  64.   k=keyevent;
  65.   keyevent=0;
  66.   return k;
  67. }
  68.  
  69. unsigned char keystate(unsigned char k)
  70. {
  71.   unsigned char ok;
  72.   ok=oldkeyb[k];
  73.   oldkeyb[k]=keyb[k];
  74.   if(ok==0) {
  75.     if(keyb[k]==0) return open;
  76.     return pressed;
  77.   }
  78.   if(keyb[k]==1) return held;
  79.   return released;
  80. }
  81.  
  82. void pm_kb_handler(void)
  83. {
  84.   unsigned char b;
  85.   disable();
  86.   b=inportb(0x60);
  87.   while(kbhit()) getch();
  88.   if((b<128)&&(numkeyspressed<20)&&(oldkeyb[b]==0))
  89.     keyspressed[numkeyspressed++]=b;
  90.   memcpy(oldkeyb,keyb,128);
  91.   if(b>127) keyb[b-128]=0;
  92.   else keyb[b]=1;
  93.   if(b<128) keyevent=1;
  94.   memset(&_kb_r, 0, sizeof(_kb_r));
  95.   _kb_r.x.cs = old_rm_kb_vector.rm_segment;
  96.   _kb_r.x.ip = old_rm_kb_vector.rm_offset;
  97.   _kb_r.x.ss = _kb_r.x.sp = 0;
  98.   enable();
  99.   _go32_dpmi_simulate_fcall_iret(&_kb_r);
  100. }
  101.  
  102. void rm_kb_handler(void)
  103. {
  104.   unsigned char b;
  105.   disable();
  106.   b=inportb(0x60);
  107.   while(kbhit()) getch();
  108.   if((b<128)&&(numkeyspressed<20)&&(oldkeyb[b]==0))
  109.     keyspressed[numkeyspressed++]=b;
  110.   memcpy(oldkeyb,keyb,128);
  111.   if(b>127) keyb[b-128]=0;
  112.   else keyb[b]=1;
  113.   if(b<128) keyevent=1;
  114.   memset(&_kb_r, 0, sizeof(_kb_r));
  115.   _kb_r.x.cs = old_rm_kb_vector.rm_segment;
  116.   _kb_r.x.ip = old_rm_kb_vector.rm_offset;
  117.   _kb_r.x.ss = _kb_r.x.sp = 0;
  118.   enable();
  119.   _go32_dpmi_simulate_fcall_iret(&_kb_r);
  120. }
  121.